;Datei : listing8.asm
;Beschreibung: Eine Bitplane (320 x 512) mit Muster die hoch und
; runter scrollt.
;Autor : Enrico Bauermeister
;Datum : 16.12.1997
;Assembler : TFA AsmOne v1.30
;===============================================================
;Interrupts sperren - Betriebssystem ausschalten
;-----------------------------------------------
move.w #$4000,$dff09a
;Sprites ausschalten (sonst stören die nur)
;------------------------------------------
move.w #$0020,$dff096
;Adresse der Bitplane in die Bitplanepointer eintragen
;-----------------------------------------------------
;Zuerst wird das Low-Word in $dff0e2 und anschließend das High-Word in
;$dff0e0 eingetragen.
;-----------------------------------------------------
move.l #bitplane,d0 ;Bitplane-Aresse nach d0
move.w d0,bitplanepointer+6 ;Low-Word eintragen
swap d0 ;Words in d0 vertauschen
move.w d0,bitplanepointer+2 ;High-Word eintragen
;Copperliste aktivieren
;----------------------
move.l #Copperliste,$dff084
;Muser erzeugen
;--------------
bsr.w muster
;Warten auf Rasterstrahl (eine 1/50 Sekunde)
;-------------------------------------------
wait:
move.l $dff004,d0
and.l #$fff00,d0
cmp.l #$00003000,d0
bne.s wait
;Bildschirm scrollen
;-------------------
bsr.w scroll
;Linke Maustaste gedrückt ?
;--------------------------
btst #6,$bfe001
bne.s wait
;Sprites wieder einschalten
;--------------------------
move.w #$8020,$dff096
;Interrupts wieder erlauben
;--------------------------
move.w #$c000,$dff09a
;Programmende
;------------
moveq #0,d0
rts
;Datenbereich
;------------
richtung: dc.b 0,0
;Routine um ein Muster auf der Bitplane zu erzeugen
;--------------------------------------------------
muster:
lea bitplane,a0 ;Adresse der Bitplane
moveq #16-1,d0 ;16 Paare von 16 Punkten hohen Quadraten
;(jedes Paar (ein schwarzes und ein weißes
; Quadrat) ist 32 Punkte hoch -> 8 Paare
; davon untereinander und die Bitplane ist
; voll (512 Punkte hoch))
mpaar:
move.l #(10*16)-1,d1 ;10 Paare um eine Zeile zu füllen (320 Punkte)
;16 Zeilen sind zu füllen
meins:
move.l #%11111111111111110000000000000000,(a0)+ ;Bits in der Bitplane
dbra d1,meins ;Mit "dbra" kann man Zähl- ;setzen
;schleifen in Assembler
;realisieren. Bei dieser
;Anweisung wird D1 bis auf
;-1 runtergezählt. Ist D1
;noch nicht -1, so wird zum
;Label "meins" gesprungen.
;Eine DBRA-Schleife zählt
;also immer bis -1 und nicht
;bis 0.
move.l #(10*16)-1,d1 ;10 Paare um eine Zeile zu füllen (320 Punkte)
;16 Zeilen sind zu füllen
mzwei:
move.l #%00000000000000001111111111111111,(a0)+ ;Bits in der Bitplane
dbra d1,mzwei ;setzen
dbra d0,mpaar
rts
;Routine um den Bildschirm zu scrollen
;-------------------------------------
;Die Bitplane wird 256 Zeilen gescrollt. Ob wir hoch oder runter scrollen
;müssen, merken wir uns in "richtung".
;-------------------------------------
scroll:
;Bitplanepointer auslesen
;++++++++++++++++++++++++
lea bitplanepointer,a1 ;Bitplanepointer nach A1
move.w 2(a1),d0; ;High-Word auslesen
swap d0 ;Words vertauschen
move.w 6(a1),d0 ;Low-Word auslesen
;++++++++++++++++++++++++
tst.b richtung ;"richtung" = 0 ?
beq.w hoch ;wenn ja -> hoch scrollen
cmpi.l #bitplane,d0 ;Bild wieder an Ausgangsposition ?
beq.s setzerunter ;wenn ja -> "richtung" runter setzen
sub.l #40,d0 ;eine Zeile nach unten scrollen
bra.s scrollende
setzerunter:
clr.b richtung ;"richtung" löschen
bra.s scrollende
hoch:
cmpi.l #bitplane+(40*256),d0 ;Bild schon 256 Zeile nach oben gescrollt ?
beq.s setzerauf ;wenn ja -> "richtung" hoch setzen
add.l #40,d0 ;eine Zeile nach oben scrollen
bra.s scrollende
setzerauf:
move.b #$ff,richtung ;hex. FF nach "richtung" kopieren
rts
;Bitplanepointer neu eintragen
;+++++++++++++++++++++++++++++
scrollende:
lea bitplanepointer,a1 ;Bitplanepointer nach A1
move.w d0,6(a1) ;Low-Word eintragen
swap d0 ;Words vertauschen
move.w d0,2(a1) ;High-Word eintragen
rts
;Copperliste
;-----------
SECTION Cl,CODE_C
Copperliste:
dc.w $008e,$2c81 ;DIWSTRT
dc.w $0090,$2cc1 ;DIWSTOP
dc.w $0092,$0038 ;DDFSTRT
dc.w $0094,$00d0 ;DDFSTOP
dc.w $0100,$1200 ;BPLCON0
dc.w $0108,$0000 ;BPL1MOD
dc.w $010a,$0000 ;BPL2MOD
bitplanepointer:
dc.w $00e0,$0000 ;BPL1PTH
dc.w $00e2,$0000 ;BPL1PTL
dc.w $0180,$0000 ;COLOR00
dc.w $0182,$0fff ;COLOR01
dc.w $ffff,$fffe ;Copperlistenende
;Bitplane
;--------
SECTION Bp,BSS_C
bitplane:
ds.b 20480
END
Zurück zum Programmierkurs